/*@internal*/
名域 ts {
    声明 常量 性能: { now?(): 数字 };
    /** Gets a timestamp with (at least) ms resolution */
    导出 常量 时间戳 = 类为 性能 !== '未定' && 性能.now ? () => 性能!.now!() : 日期_.现在 ? 日期_.现在 : () => +(新建 日期_());
}

/*@internal*/
/** Performance measurements for the compiler. */
名域 ts.性能 {
    声明 常量 onProfilerEvent: { (markName: 文字): 无值; profiler: 真假; };

    // NOTE: cannot use ts.noop as core.ts loads after this
    常量 profilerEvent: (markName: 文字) => 无值 = 类为 onProfilerEvent === 'function' && onProfilerEvent.profiler === 为真 ? onProfilerEvent : () => { /*empty*/ };

    变量 启用 = 为假;
    变量 profilerStart = 0;
    变量 counts: 词典_<数字>;
    变量 marks: 词典_<数字>;
    变量 measures: 词典_<数字>;

    /**
     * Marks a 性能 event.
     *
     * @param markName The 名称 of the mark.
     */
    导出 函数 标记(markName: 文字) {
        如果 (启用) {
            marks.设置(markName, 时间戳());
            counts.设置(markName, (counts.获取(markName) || 0) + 1);
            profilerEvent(markName);
        }
    }

    /**
     * Adds a 性能 measurement with the specified 名称.
     *
     * @param measureName The 名称 of the 性能 measurement.
     * @param startMarkName The 名称 of the starting mark. If not supplied, the point at which the
     *      profiler was 启用 is used.
     * @param endMarkName The 名称 of the ending mark. If not supplied, the 当前 timestamp is
     *      used.
     */
    导出 函数 度量(measureName: 文字, startMarkName?: 文字, endMarkName?: 文字) {
        如果 (启用) {
            常量 尾位 = endMarkName && marks.获取(endMarkName) || 时间戳();
            常量 开始 = startMarkName && marks.获取(startMarkName) || profilerStart;
            measures.设置(measureName, (measures.获取(measureName) || 0) + (尾位 - 开始));
        }
    }

    /**
     * Gets the number of times a marker was encountered.
     *
     * @param markName The 名称 of the mark.
     */
    导出 函数 getCount(markName: 文字) {
        返回 counts && counts.获取(markName) || 0;
    }

    /**
     * Gets the total duration of all measurements with the supplied 名称.
     *
     * @param measureName The 名称 of the measure whose durations should be accumulated.
     */
    导出 函数 获取持续时间(measureName: 文字) {
        返回 measures && measures.获取(measureName) || 0;
    }

    /**
     * Iterate over each measure, performing some action
     *
     * @param cb The action to perform for each measure
     */
    导出 函数 循环测量(cb: (measureName: 文字, duration: 数字) => 无值) {
        measures.循环执行((measure, key) => {
            cb(key, measure);
        });
    }

    /** Enables (and resets) 性能 measurements for the compiler. */
    导出 函数 启用性能() {
        counts = 创建词典<数字>();
        marks = 创建词典<数字>();
        measures = 创建词典<数字>();
        启用 = 为真;
        profilerStart = 时间戳();
    }

    /** Disables 性能 measurements for the compiler. */
    导出 函数 禁用性能() {
        启用 = 为假;
    }
}
